
package com.x52im.rbchat.logic.contact.model;

import android.text.TextUtils;

import com.eva.android.ToolKits;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 用于列表中显示的好友数据封装类。
 *
 * @author JackJiang
 * @since 8.0
 */
public class FriendItemValue {

    /** 用于列表中UI上显示的排序分类字符，也就是好友昵称的首字母（比如：A~Z、#号符等）*/
    private String category = "";
    /** 用于列表中按昵称拼音排序的字段，昵称中如果是汉字则会转汉语拼音（此字段不用于ui显示，因为它可能是不友好的无意义字符）*/
    private String nameWithPinyin;
    /** 是否显示排序分类字符 */
    private boolean showCategory;
    /** 原始的用户信息数据 */
    private RosterElementEntity friendInfo;

    public FriendItemValue(RosterElementEntity friendInfo) {
        this.friendInfo = friendInfo;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getNameWithPinyin() {
        return nameWithPinyin;
    }

    public void setNameWithPinyin(String nameWithPinyin) {
        this.nameWithPinyin = nameWithPinyin;
    }

    public boolean isShowCategory() {
        return showCategory;
    }

    public void setShowCategory(boolean showCategory) {
        this.showCategory = showCategory;
    }

    public RosterElementEntity getFriendInfo() {
        return friendInfo;
    }

    public void setFriendInfo(RosterElementEntity friendInfo) {
        this.friendInfo = friendInfo;
    }

    /**
     * 生成FriendValue对象。
     *
     * @param ree 原始的用户信息数据
     * @return  返回新建的FriendValue对象
     */
    public static FriendItemValue fromUserInfo(RosterElementEntity ree) {
        FriendItemValue info = new FriendItemValue(ree);
        String indexLetter;
        String displayName = ree.getNickNameWithRemark();

        if (!TextUtils.isEmpty(displayName)) {
            String pinyin = ToolKits.getPinyin(displayName);
            char c = pinyin.toUpperCase().charAt(0);
            if (c >= 'A' && c <= 'Z') {
                indexLetter = c + "";
                info.setNameWithPinyin(pinyin);
            } else {
                indexLetter = "#";
                // 为了让排序排到最后
                info.setNameWithPinyin("{" + pinyin);
            }
            info.setCategory(indexLetter);
        } else {
            info.setNameWithPinyin("");
        }

        return info;
    }

    /**
     * 从原始的用户信息数据中创创建FriendValue对象数组。
     *
     * @param userInfos 原始的用户信息对象数组
     * @return 如果用户信息对象数据不为空则返回FriendValue对象数组，否则返回null
     * @see #fromUserInfo(RosterElementEntity)
     */
    public static List<FriendItemValue> fromUserInfos(List<RosterElementEntity> userInfos) {
        if (userInfos != null && !userInfos.isEmpty()) {

            List<FriendItemValue> uiUserInfos = new ArrayList<>(userInfos.size());
            String indexLetter;

            // 生成FriendValue对象
            for (RosterElementEntity userInfo : userInfos) {
                uiUserInfos.add(fromUserInfo(userInfo));
            }

            // 对FriendValue对象按排序字符排序
            Collections.sort(uiUserInfos, (o1, o2) -> o1.getNameWithPinyin().compareToIgnoreCase(o2.getNameWithPinyin()));

            // 判断并设置标记：用于指示是否在ui上显示排序字符
            String preIndexLetter = null;
            for (FriendItemValue info : uiUserInfos) {
                indexLetter = info.getCategory();
                if (preIndexLetter == null || !preIndexLetter.equals(indexLetter)) {
                    info.setShowCategory(true);
                }
                preIndexLetter = indexLetter;
            }

            return uiUserInfos;
        } else {
            return null;
        }
    }
}
